package main

import (
	"fmt"
	"sync"
	"time"
)

/*
  golang 中 goroutine channel 实现并发和并行
	!注意： 主进程结束 协程也就会结束 不管其是否进行完
*/

/*
  在主线程（可以理解成进程）中，开启一个goroutine，该协程每隔50毫秒输出“你好golang”
	在主线程中也每隔100ms输出“你好golang”，输出10次后，退出程序
	要求主线程和goroutine同时执行
*/

var wg sync.WaitGroup

func test1() {
	for i := 0; i < 10; i++ {
		fmt.Println("你好golang from __ test111--", i)
		time.Sleep(time.Millisecond * 100)
	}
	wg.Done() //让协程计数器减1
}
func test2() {
	for i := 0; i < 10; i++ {
		fmt.Println("你好golang from __ test222--", i)
		time.Sleep(time.Millisecond * 100)
	}
	wg.Done() //让协程计数器减1
}

func main() {
	wg.Add(1)  //让协程计数器加1
	go test1() // 表示开启一个协程
	wg.Add(1)  //让协程计数器加1
	go test2() // 表示开启一个协程
	for i := 0; i < 10; i++ {
		fmt.Println("你好golang from __ main--", i)
		time.Sleep(time.Millisecond * 50)
	}
	// time.Sleep(time.Second)

	wg.Wait() // 等待协程计数器归零
	fmt.Println("main over")
}
